# 数据分析题目解答(建议先赞后看，养成习惯 如果不赞，先拉出去枪毙两分钟 作者：小匠IT)
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager as fm
import os

# 确保输出文件夹存在
output_dir = 'output'
os.makedirs(output_dir, exist_ok=True)

# 读取Excel文件
file_path = 'data/14/竞品销售数据分析-原始数据(1).xlsx'
data = pd.read_excel(file_path)

# 检查数据，确保日期列是datetime类型
data['日期'] = pd.to_datetime(data['日期'])

# 添加星期信息（0为周一，6为周日）
data['星期'] = data['日期'].dt.weekday

# 创建数据透视表以找出销量最好和最差的时间段（按星期汇总）
pivot_table_weekly = pd.pivot_table(data, values='30天销量', index=['星期'], aggfunc=sum)

# 找出销量最好和最差的一周
best_week = pivot_table_weekly.idxmax()
worst_week = pivot_table_weekly.idxmin()

print(f"销量最好的一周是星期 {best_week}，销量为 {pivot_table_weekly.loc[best_week]['30天销量']}。")
print(f"销量最差的一周是星期 {worst_week}，销量为 {pivot_table_weekly.loc[worst_week]['30天销量']}。")

# 保存数据透视表到Excel文件
pivot_output_path = os.path.join(output_dir, '竞品交易周数据透视表.xlsx')
with pd.ExcelWriter(pivot_output_path) as writer:
    pivot_table_weekly.to_excel(writer, sheet_name='交易周数据透视表')

# 绘制折线图并标注最高和最低点
plt.figure(figsize=(14, 7))

# 设置全局字体属性
plt.rcParams['font.sans-serif']=['SimSun']  # 中文宋体
plt.rcParams['axes.unicode_minus']=False  # 解决负号 '-' 显示为方块的问题

# 绘制折线图
plt.plot(data['日期'], data['30天销量'], marker='o', linestyle='-')

# 添加标题和轴标签
plt.title('竞品30天销量趋势图', fontproperties=fm.FontProperties(fname='fonts/SIMSUN.TTC'))
plt.xlabel('日期')
plt.ylabel('30天销量')

# 添加网格线
plt.grid(True)

# 找出销量最高的日期及其对应的销量值
max_sales_date = data.loc[data['30天销量'].idxmax()]['日期']
max_sales_value = data.loc[data['30天销量'].idxmax()]['30天销量']

# 找出销量最低的日期及其对应的销量值
min_sales_date = data.loc[data['30天销量'].idxmin()]['日期']
min_sales_value = data.loc[data['30天销量'].idxmin()]['30天销量']

# 在最高顶点添加数据标签
plt.text(max_sales_date, max_sales_value, f'{int(max_sales_value)}', 
         ha='center', va='bottom', color='red')

# 在最低点添加数据标签
plt.text(min_sales_date, min_sales_value, f'{int(min_sales_value)}', 
         ha='center', va='top', color='blue')

# 调整布局以防止重叠
plt.tight_layout()

# 保存图表到文件
chart_output_path = os.path.join(output_dir, '竞品销售趋势图.png')
plt.savefig(chart_output_path, dpi=300, bbox_inches='tight')  # 保存图表为图片文件

# 显示图表
plt.show()

# 输出销量最好的和最差的信息
print(f"销售量爆发期是 {max_sales_date}，销量为 {max_sales_value}")
print(f"销售量最低期是 {min_sales_date}，销量为 {min_sales_value}")